module tb_add_vector();

   logic [63:0] comp;
   logic [63:0] op_a;
   logic [7:0] 	i_gen;
   logic [3:0] 	mode;
   complement_vector #(.width(64), 
					   .granu(8)) U_complement_vector (
													   // Outputs
													   .o_comp			(comp),
													   // Inputs
													   .i_a				(op_a),
													   .i_gen			(i_gen),
													   .i_mode			(mode) );
   
   initial
   	 begin
		logic [63:0] correct_result;
		
		for(int i=0;i<4;i++)
		  begin
			 $display("=============== test %d-bit mode ===============", (2**i)*8 );
			 for(int loop=0;loop<1000;loop++)
			   begin
				  mode = 1 << i;
				  op_a = {$random, $random};
				  i_gen = $random;
				  for(int j=0;j<8/(2**i);j++)
					begin
					   // correct_result[(2**i)*8*j+(2**i)*8:(2**i)*8*j] = abs(op_a[(2**i)*8*j+(2**i)*8:(2**i)*8*j]);
					   // correct_result[(2**i)*8*j+(2**i)*8:(2**i)*8*j] = abs(op_a[(2**i)*8*j+(2**i)*8:(2**i)*8*j]);
					   if((2**i)*8 == 64)
						 begin
							// correct_result[64*j+:64] = $abs(op_a[64*j+:64]);
							// correct_result[64*j+:64] = op_a[64*j+:64][63] ? ~op_a[64*j+:64]+1 : op_a[64*j+:64];
							correct_result[63:0] = i_gen[7] ? ~op_a[63:0]+1 : op_a[63:0];
						 end
					   if((2**i)*8 == 32)
						 begin
							correct_result[63:0] = { i_gen[7] ? ~op_a[63:32]+1 : op_a[63:32], i_gen[3] ? ~op_a[31:0]+1 : op_a[31:0] };
						 end
					end
				  
				  #1;
				  $display("complement(%x) => %x, correct:%x  =>  %s",
						   op_a, comp, correct_result, 
						   comp === correct_result ? "equal" : "not equal" );
			   end
			 // $display("=============== passed ===============");
		  end
	 end // initial begin
endmodule // tb_add_vector
